package br.com.foxinline.manager.criar;

import br.com.foxinline.modelo.Ato;
import br.com.foxinline.modelo.AtoCampo;
import br.com.foxinline.modelo.AtoTipo;
import br.com.foxinline.modelo.TipoSelo;
import br.com.foxinline.servico.AtoCampoServico;
import br.com.foxinline.servico.AtoServico;
import br.com.foxinline.servico.AtoTipoServico;
import br.com.foxinline.servico.TipoSeloServico;
import br.com.foxinline.utilitario.Mensagem;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.DualListModel;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerCriarAto implements Serializable {

    @EJB
    AtoServico atoServico;
    @EJB
    AtoTipoServico atoTipoServico;
    @EJB
    AtoCampoServico atoCampoServico;
    @EJB
    TipoSeloServico tipoSeloServico;
    
        
    private Ato ato;
    private List<Ato> atos;
    
    private AtoTipo atoTipoPesquisa;
    private AtoTipo atoTipoSelecionado;
    private List<AtoTipo> atoTipos;
    
    private TipoSelo tipoSeloPesquisa;
    private TipoSelo tipoSeloSelecionado;
    private List<TipoSelo> tiposSelo;
    
    private List<AtoCampo> atoCampos;
    private List<AtoCampo> atoCamposSelecionados;
    private DualListModel<AtoCampo> atoCompoDualList;
    
    @PostConstruct
    public void init() {
        this.ato = new Ato();
        this.ato.setAtoTipo(new AtoTipo());
        this.ato.setTipoSelo(new TipoSelo());
        this.atos = new ArrayList<Ato>();
        
        this.atoTipoPesquisa = new AtoTipo();
        this.atoTipoSelecionado = new AtoTipo();
        this.atoTipos = new ArrayList<AtoTipo>();
        
        this.tipoSeloPesquisa = new TipoSelo();
        this.tipoSeloSelecionado = new TipoSelo();
        this.tiposSelo = new ArrayList<TipoSelo>();
        limparAtoCampos();
    }
    
    public void pesquisarAtoTipos() {
        this.atoTipos = atoTipoServico.pesquisar(this.atoTipoPesquisa);
    }
    
    public void selecionarAtoTipo() {
        this.ato.setAtoTipo(this.atoTipoSelecionado);
        
        this.atoTipoPesquisa = new AtoTipo();
        this.atoTipoSelecionado = new AtoTipo();
        this.atoTipos = new ArrayList<AtoTipo>();
    }

    public void limparAtoTipos() {
        this.atoTipoPesquisa = new AtoTipo();
        this.atoTipos = new ArrayList<AtoTipo>();
    }

    public void pesquisarTiposSelo() {
        this.tiposSelo = tipoSeloServico.pesquisar(tipoSeloPesquisa);
    }
    
    public void selecionarTipoSelo() {
        this.ato.setTipoSelo(this.tipoSeloSelecionado);
        
        this.tipoSeloPesquisa = new TipoSelo();
        this.tipoSeloSelecionado = new TipoSelo();
        this.tiposSelo = new ArrayList<TipoSelo>();
    }

    public void limparTipoSelos() {
        this.tipoSeloPesquisa = new TipoSelo();
        this.tiposSelo = new ArrayList<TipoSelo>();
    }    

    public void adicionarAto() {
        this.atoCamposSelecionados = this.atoCompoDualList.getTarget();
        this.ato.setAtoCampos(this.atoCamposSelecionados);
        this.atos.add(this.ato);
        

        this.ato = new Ato();
        this.ato.setAtoTipo(new AtoTipo());
        this.ato.setTipoSelo(new TipoSelo());      
        
        limparAtoCampos();
    }
    
    public void editarAto(Ato ato) {
        this.ato = ato;
        removerAto(ato);
        
        this.atoCampos = atoCampoServico.pesquisarTodos();
        this.atoCampos.removeAll(this.ato.getAtoCampos());
        this.atoCamposSelecionados = this.ato.getAtoCampos();
        this.atoCompoDualList = new DualListModel<AtoCampo>(this.atoCampos, this.atoCamposSelecionados);
    }
    
    public void removerAto(Ato ato) {
        this.atos.remove(ato);
    }
    
    public void limpar() {
        this.ato = new Ato();
        limparAtoCampos();      
    }

    private void limparAtoCampos() {
        this.atoCampos = atoCampoServico.pesquisarTodos();
        this.atoCamposSelecionados = new ArrayList<AtoCampo>();
        this.atoCompoDualList = new DualListModel<AtoCampo>(this.atoCampos, this.atoCamposSelecionados);
    }
    
    public void salvar() {
        for (Ato instancia : this.atos) {
            atoServico.salvar(instancia);
        }
        init();
        Mensagem.messagemInfo("Campo do Ato cadastrado com sucesso!");
    }
            
    public Ato getAto() {
        return ato;
    }

    public void setAto(Ato ato) {
        this.ato = ato;
    }

    public List<Ato> getAtos() {
        return atos;
    }

    public void setAtos(List<Ato> atos) {
        this.atos = atos;
    }
    
    public AtoTipo getAtoTipoPesquisa() {
        return atoTipoPesquisa;
    }

    public void setAtoTipoPesquisa(AtoTipo atoTipoPesquisa) {
        this.atoTipoPesquisa = atoTipoPesquisa;
    }

    public AtoTipo getAtoTipoSelecionado() {
        return atoTipoSelecionado;
    }

    public void setAtoTipoSelecionado(AtoTipo atoTipoSelecionado) {
        this.atoTipoSelecionado = atoTipoSelecionado;
    }

    public List<AtoTipo> getAtoTipos() {
        return atoTipos;
    }

    public void setAtoTipos(List<AtoTipo> atoTipos) {
        this.atoTipos = atoTipos;
    }

    public TipoSelo getTipoSeloPesquisa() {
        return tipoSeloPesquisa;
    }

    public void setTipoSeloPesquisa(TipoSelo tipoSeloPesquisa) {
        this.tipoSeloPesquisa = tipoSeloPesquisa;
    }

    public TipoSelo getTipoSeloSelecionado() {
        return tipoSeloSelecionado;
    }

    public void setTipoSeloSelecionado(TipoSelo tipoSeloSelecionado) {
        this.tipoSeloSelecionado = tipoSeloSelecionado;
    }

    public List<TipoSelo> getTiposSelo() {
        return tiposSelo;
    }

    public void setTiposSelo(List<TipoSelo> tiposSelo) {
        this.tiposSelo = tiposSelo;
    }

    public DualListModel<AtoCampo> getAtoCompoDualList() {
        return atoCompoDualList;
    }

    public void setAtoCompoDualList(DualListModel<AtoCampo> atoCompoDualList) {
        this.atoCompoDualList = atoCompoDualList;
    }

    public List<AtoCampo> getAtoCampos() {
        return atoCampos;
    }

    public void setAtoCampos(List<AtoCampo> atoCampos) {
        this.atoCampos = atoCampos;
    }

    public List<AtoCampo> getAtoCamposSelecionados() {
        return atoCamposSelecionados;
    }

    public void setAtoCamposSelecionados(List<AtoCampo> atoCamposSelecionados) {
        this.atoCamposSelecionados = atoCamposSelecionados;
    }

}
